/**
 * 
 */
package res.graph;

import java.util.HashSet;


/**
 * @author araruna
 *
 */
public class DirectedSimpleGraph extends ReadableGraph {

	private boolean[][] adjmatrix = null;
	
	public DirectedSimpleGraph(int numvertices) {
		super(numvertices);
		
		edges = new HashSet<Edge>();
		adjmatrix = new boolean[numvertices][numvertices];
	}

	/**
	 * @return <code>true</code>, se um percurso no grafo alcança todos os vértices, dado que o vértice de início não é um fonte. 
	 */
	@Override
	public boolean isConnected() {
		// TODO Verificar se nenhum vértice é sumidouro
		return (!vertices[0].isSource()
				&& new BreadthFirstIterator().traversal.size() == vertices.length);
	}
	
	/**
	 * @return <code>true</code> se ambos os vértices fazem parte do grafo e <code>v</code> faz parte da vizinhança de saída de <code>u</code> (aresta u &rarr; v). 
	 */
	@Override
	public boolean containsEdge(Vertex u, Vertex v) {
		return (u.getGraph() == this && v.getGraph() == this
				&& u.outNeighbours.contains(v));
	}
	
	public boolean hasEdge(int u, int v) {
		return (u >= 0 && v >= 0) && adjmatrix[u][v];
	}

	@Override
	public Vertex getVertex(int n) {
		return vertices[n];
	}

	@Override
	public Edge addEdge(int u, int v) {
		Edge uv = new Edge(this, vertices[u], vertices[v]);
		adjmatrix[u][v] = true;
		
		edges.add(uv);
		return uv;
	}

	@Override
	public Edge addEdge(int u, int v, double weight) {
		Edge uv = new Edge(this, vertices[u], vertices[v], weight);
		adjmatrix[u][v] = true;
		
		edges.add(uv);
		return uv;
	}

	@Override
	public int getNumEdges() {
		return edges.size();
	}
}
